package marketplace.web.beans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import marketplace.ejb.interfaces.IContenidoDigitalEJB;
import marketplace.ejb.interfaces.IUsuarioEJB;
import marketplace.ejb.interfaces.IVentaEJB;
import marketplace.jpa.datas.DataContenidoDigital;
import marketplace.jpa.datas.DataVersion;
import marketplace.web.utils.UtilsBean;

@ManagedBean
@SessionScoped
public class VersionBean {

	
	/////////////////////////// INYECCIONES //////////////////////////////
	
	
	@EJB	IContenidoDigitalEJB ejb;	
	@EJB	IUsuarioEJB ejbUsuario;
	@EJB	IVentaEJB ejbVenta;
	
	
	/////////////////////////// ATRIBUTOS //////////////////////////////
	
	
	private int idContenido;
	private int idVersion;
	private int numero;
	private String nombre;
	private Double precio;
	private Double tamanio;
	private int cantDescargas;
	private String estadoAprobacion;
	private String archivo;
	private Date fechaCreacion;
	
	private DataContenidoDigital contenido;	
	
	private String buscar;
	
	
	/////////////////////////// COLECCIONES //////////////////////////////
	
	
	
	private List<DataContenidoDigital> contenidos;
	private List<DataContenidoDigital> contenidosFiltrados;
	private List<DataVersion> versiones;
		
	private List<DataVersion> versionesProveedor;
	
	
	
	/////////////////////////// GETERS & SETERS /////////////////////////////
	
	
	
	public int getIdContenido() { return idContenido; }
	public void setIdContenido(int idContenido) { this.idContenido = idContenido; }
	
	public int getIdVersion() { return idVersion; }
	public void setIdVersion(int idVersion) { this.idVersion = idVersion; }

	public int getNumero() { return numero; }
	public void setNumero(int numero) { this.numero = numero; }

	public String getNombre() { return nombre; }
	public void setNombre(String nombre) { this.nombre = nombre; }

	public Double getPrecio() { return precio; }
	public void setPrecio(Double precio) { this.precio = precio; }

	public Double getTamanio() { return tamanio; }
	public void setTamanio(Double tamanio) { this.tamanio = tamanio; }

	public int getCantDescargas() { return cantDescargas; }
	public void setCantDescargas(int cantDescragas) { this.cantDescargas = cantDescragas; }

	public String getEstadoAprobacion() { return estadoAprobacion; }
	public void setEstadoAprobacion(String estadoAprobacion) { this.estadoAprobacion = estadoAprobacion; }

	public Date getFechaCreacion() { return fechaCreacion; }
	public void setFechaCreacion(Date fechaCreacion) { this.fechaCreacion = fechaCreacion; }	
	
	public String getArchivo() { return archivo; }
	public void setArchivo(String archivo) { this.archivo = archivo; }
		
	
	public DataContenidoDigital getContenido() { return contenido; }
	public void setContenido(DataContenidoDigital contenido) { this.contenido = contenido; }

	public String getBuscar() { return buscar; }
	public void setBuscar(String buscar) { this.buscar = buscar; }
	
	public List<DataVersion> getVersiones() { return versiones; }
	public void setVersiones(List<DataVersion> versiones) { this.versiones = versiones; }

	public List<DataContenidoDigital> getContenidos() { return contenidos; }
	public void setContenidos(List<DataContenidoDigital> contenidos) { this.contenidos = contenidos; }

	public List<DataVersion> getVersionesProveedor() { return versionesProveedor;}
	public void setVersionesProveedor(List<DataVersion> contenidosProveedor) { this.versionesProveedor = contenidosProveedor; }

	public List<DataContenidoDigital> getContenidosFiltrados() { return contenidosFiltrados; }
	public void setContenidosFiltrados(List<DataContenidoDigital> contenidosFiltrados) { this.contenidosFiltrados = contenidosFiltrados; }
	
	
	
	/////////////////////////// OPERACIONES ////////////////////////////
		
	
	@PostConstruct
	public void init(){
		try {
			new UtilsBean().CopiarArchivosAlServidor();
			//new UtilsBean().CopiarArchivosAlServidor();			
			setContenido(new DataContenidoDigital());
			setVersiones(ejb.getVersiones());
			setContenidos(ejb.getContenidoDigitales());
			setContenidosFiltrados(new ArrayList<DataContenidoDigital>());
			//Carga vacio xq no hay proveedor en sesion
			setVersionesProveedor(new ArrayList<DataVersion>());
			
		} catch (Exception e) {
			System.out.println("ERROR init() VersionBean: " + e.getMessage());
		}
	}

    
	
	//// VERSION /////////////////////////////////////////////////////////////////////
	
	
	
	//GET REGISTRAR VERSION
	public void getAddVersion() throws Exception{		
		FacesContext.getCurrentInstance().getExternalContext().redirect("versionRegistro.xhtml");
	}	

	
	
	//Sobreescribo la lista de versiones para el filtro del combos
	public void getVersionesPorContenido(){
		try {
			setVersiones(ejb.getVersiones(getContenido().getIdContenido()));
		} catch (Exception e) {
			System.out.println("ERROR getVersionesPorContenido: " + e.getMessage());
		}
	}
	
	
	//POST REGISTRAR CONTENIDO DIGITAL Y VERSION
	public void postRegistroVersionCD(ActionEvent actionEvent){										
		try {
			
			HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
			
			if(getNombre().isEmpty())
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Debe ingresar el nombre de la version del contenido digital deseado",""));
			else if(getNumero()==0)
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Debe ingresar el numero de version del contenido digital deseado",""));
			else if (ejb.existeContenidoDigital(contenido.getNombre()))
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR: El contenido digital a ingresar ya existe!","Compruebe sus datos"));
/*			else if (!getPrecio().isNaN() || !getPrecio().isInfinite())
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR: El precio de la version debe ser del tipo 123 o 123.4","Compruebe sus datos"));
			else if ((!sesion.getAttribute("archivo").equals(null)) || (!sesion.getAttribute("archivo").equals("")))
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR: Debe ingresar un archivo para la version",""));
*/			else if (!ejb.existeVersionNumero(getContenido().getIdContenido(), getNumero())){
				String proveedor = (String) sesion.getAttribute("mailUsuario");
				Long tamanio = (Long) sesion.getAttribute("tamanio");
				
				
				/*Renombro los archivos y los respaldo por el clean*/
				
				new UtilsBean().renombrarLogo(contenido.getNombre());
				new UtilsBean().renombrarImagenes(contenido.getNombre());
			
				new UtilsBean().renombrarArchivo(contenido.getNombre(), getNombre(), getNumero());
				
				//Lo hago despues porque es cuando lo renombro
				String archivo = (String) sesion.getAttribute("archivo");
				
				int idCD = ejb.guardarContenidoDigital(contenido.getNombre(), contenido.getDescripcion(), contenido.getVideo(), contenido.getSubcategoria().getNombre(), proveedor);				
				
				
				System.out.println("postRegistroVersionCD: Registro! // CD: " + contenido.getNombre() + " // SubCategoria: " + contenido.getSubcategoria().getNombre() + " // Proveedor : "+proveedor);
				
				//Me registro la version del contenido digital
				ejb.guardarVersion(getNumero(), getNombre(), getPrecio(), "PENDIENTE", archivo.toString(), Double.parseDouble(tamanio.toString()), idCD);
				
				setVersiones((ArrayList<DataVersion>) ejb.getVersiones());				
				setVersionesProveedor((ArrayList<DataVersion>) ejb.getVersionesProveedor(proveedor));
				
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha registrado la version numero : ", getNumero() + "!, correctamente"));
				FacesContext.getCurrentInstance().getExternalContext().redirect("versionListar.xhtml");
				
			}else{
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR: El numero de version ingresado ya existe!","Compruebe sus datos"));
			}
		} catch (Exception e) {
			System.out.println("ERROR postRegistroVersion: " + e.getMessage());
		}
	}

	
	//POST AGREGAR VERSION
	public void addVersionCD(){
		try {
			if(getNombre().isEmpty())
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Debe ingresar el nombre de la version del contenido digital deseado",""));
			else if(getNumero()==0)
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Debe ingresar el numero de version del contenido digital deseado",""));		
			else if (!ejb.existeVersionNumero(getIdContenido(), getNumero())){
				
				System.out.println("addVersionCD: ENTRO!! // CD: " + getIdContenido());
				
				HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
				String proveedor = (String) sesion.getAttribute("mailUsuario");
				Long tamanio = (Long) sesion.getAttribute("tamanio");
								
				//Renombro el archivo subido
				new UtilsBean().renombrarArchivo(ejb.obtenerContenidoDigital(getIdContenido()).getNombre(), getNombre(), getNumero());				
				
				String archivo = (String) sesion.getAttribute("archivo");
				
				//Me registro la version del contenido digital
				ejb.guardarVersion(getNumero(), getNombre(), getPrecio(), "PENDIENTE", archivo, Double.parseDouble(tamanio.toString()), getIdContenido());
								
				setVersiones((ArrayList<DataVersion>) ejb.getVersiones());				
				setVersionesProveedor((ArrayList<DataVersion>) ejb.getVersionesProveedor(proveedor));
								
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha registrado la version numero : ", getNumero() + "!, correctamente"));
				FacesContext.getCurrentInstance().getExternalContext().redirect("versionListar.xhtml");
			}else{
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"ERROR: El numero de version ingresado ya existe!","Compruebe sus datos"));
			}
		} catch (Exception e) {
			System.out.println("ERROR postAddVersionCD: " + e.getMessage());
		}
		
	}

        
    //ELIMINAR VERSION
	public void postEliminarVersionCD(int id){
		try {
			ejb.eliminarVersion(id);
			System.out.println("postEliminarVersion: " + id);
			init();
		} catch (Exception e) {
			System.out.println("ERROR postEliminarVersion: " + e.getMessage());
		}
	}

    public List<String> listaImagenes(){
    	
    	ArrayList<String> devolver  = new ArrayList<String>();
    	UtilsBean ub = new UtilsBean();
    	for (int i = 0; i < 5; i++)
    		if (ub.existeArchivo(getContenido().getNombre()+i))
    			devolver.add(getContenido().getNombre()+i);
    	
    	return devolver;
    }
    
    
    //VER VERSION
	public void verInfoVersionContenido(int idContenido) throws Exception{
					
		this.setContenido(ejb.obtenerContenidoDigital(idContenido));
		DataVersion dv = ejb.obtenerDataUltimaVersionAutorizada(idContenido);
		
		this.setIdContenido(idContenido);
		this.setIdVersion(dv.getIdVersion());
		this.setNumero(dv.getNumero());
		this.setNombre(dv.getNombre());
		this.setPrecio(dv.getPrecio());
		this.setTamanio(dv.getTamanio());
		this.setCantDescargas(dv.getCantDescragas());
		this.setFechaCreacion(dv.getFechaCreacion());
		this.setArchivo(dv.getArchivo());
		
		//System.out.println("verInfoVersionContenido : ----- " + getContenido().getNombre());		
		
		FacesContext.getCurrentInstance().getExternalContext().redirect("/MarketWEB/cdVer.xhtml");
	}    
	
	
	//LISTAR VERSIONES PROVEEDOR
	public void getListarVersionesProveedor() throws Exception{
		
		HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);										
		String mailProveedor = (String) sesion.getAttribute("mailUsuario");
		setVersionesProveedor(ejb.getVersionesProveedor(mailProveedor));
		
		FacesContext.getCurrentInstance().getExternalContext().redirect("/MarketWEB/proveedor/versionListar.xhtml");
	}
	
	
	public List<DataContenidoDigital> obtenerContenidosAutorizados() throws Exception{
		return ejb.getContenidosDigitalesConVersionesAutorizadas();
	}

	
	//Si el estado es pendiente o rechazada, puede modificarla
	public void republicarVersionPublicada() throws Exception{
		//Chequeo que no sea una version aprobada lo que me queire modificar
		if (!getEstadoAprobacion().equals("APROBADA")){
			HttpSession sesion = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
			Long tamanio = (Long) sesion.getAttribute("tamanio");
			String archivo = (String) sesion.getAttribute("archivo");
			DataVersion dv = new DataVersion(getIdVersion(), getNumero(), getNombre(), getPrecio(), "PENDIENTE", archivo, Double.parseDouble(tamanio.toString()), ejb.obtenerContenidoDigital(getIdContenido()));
			
			ejb.modificarVersion(dv);
			
			getListarVersionesProveedor();
			
		}else{
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,"No puede modificar una version Aprobada",""));
		}
	}

    public void getModificarVersion(int idVersion) throws Exception {
    	DataVersion dv = ejb.obtenerVersion(idVersion);
    	if (!dv.getEstadoAprobacion().equals("APROBADA")){  		
    		this.setIdVersion(dv.getIdVersion());
    		this.setNumero(dv.getNumero());
    		this.setNombre(dv.getNombre());
    		this.setPrecio(dv.getPrecio());
    		this.setTamanio(dv.getTamanio());
    		this.setArchivo(dv.getArchivo());
    		this.setEstadoAprobacion(dv.getEstadoAprobacion());
    		
    		this.setCantDescargas(dv.getCantDescragas());
    		this.setFechaCreacion(dv.getFechaCreacion());
    		
    		this.setContenido(dv.getContDig());
    		
    		FacesContext.getCurrentInstance().getExternalContext().redirect("versionModificar.xhtml");
    		
    	}else{
    		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(FacesMessage.SEVERITY_INFO,"No puede modificar una version Aprobada",""));
    	}
    }
    
    
    //Para devolver la 
    public double getPrecioVersion(int idContenido) throws Exception {
    	return ejb.obtenerDataUltimaVersionAutorizada(idContenido).getPrecio();
    }
    
	public void obtenerContenidosFiltrados(String tipo, String valor) {
		
		try{	
			
			if (tipo.equals("subcategorias")){
				setContenidosFiltrados(ejb.getContenidoDigitalesSubcategorias(valor));			
			}else if (tipo.equals("wishlist")){
				setContenidosFiltrados(ejbUsuario.getContenidoDigitalesWishlist(valor));
			}else if (tipo.equals("buscar")){
				System.out.println("BuscarContenido : ----- " +valor);
				System.out.println("BuscarContenido : ----- " +getBuscar());
				
				if (valor.equals("_|_")) valor = getBuscar();
				
				setContenidosFiltrados(ejb.getContenidoDigitalesBusqueda(valor));
				
			}else if (tipo.equals("toppagas")){
				setContenidosFiltrados(ejbVenta.getTopPagas());
			}
			FacesContext.getCurrentInstance().getExternalContext().redirect("/MarketWEB/market/contenidos.xhtml");
			
		}catch (Exception e){
			System.out.println("ERROR: VersionBean: obtenerContenidosFiltrados: --- " + e.getMessage());
		}		
	}

	
   	
	
	
	
/*	//MODIFICAR
    public void onEditVersionCD(RowEditEvent event) {
	    DataVersion cdWeb = ((DataVersion) event.getObject());
		try {
			cdEjb.modificarVersion(cdWeb);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se ha modificado el contenido digital: ", cdWeb.getNombre() + " !,  correctamente"));
		} catch (Exception e) {
			e.printStackTrace();
		}
    }*/
/*
    public void onCancelVersionCD(RowEditEvent event) {  
        FacesMessage msg = new FacesMessage("Operacion cancelada");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }*/
    
	
	
}
